﻿/*Default Vertex Shader: Implementa la funcionalida estándar
del pipeline, incluyendo:
- Transformaciones de Viewing desde coordenadas de objeto a 
coorenadas de clipping
- Vertex Shading

Input:

- gl_Vertex: Posicion del vertice (attribute)
- gl_Normal: Normal del vertice (attribute)
- gl_Color: El color del vertice (attribute)
- gl_FrontMaterial: El material del vertice (attribute)
- gl_MultiTexCoord0: Coordenadas de 1era textura del vertice (attribute)

- gl_ModelViewMatrix: Matriz de transformacion de coordenadas de objeto a coordenadas de camara (uniform)
- gl_ModelViewProjectionMatrix: Matriz de transformacion de coordenadas de objeto a coordenadas de clipping (uniform)
- gl_NormalMatrix: Matriz de transformacion de normales de coordenadas de objeto a coordenadas de camara (uniform)  

- gl_LightSource: Arreglo con fuentes de luz (uniform) 

Output: 

- gl_Position: Las posiciones transformadas (special type)
- gl_FrontColor: El color de cada vértice (varying)  
*/

//TEST: paso de parametros
//uniform int numLights;
//attribute float numLights;

//TEST: modificar interpolacion
//flat out vec4 flatColor;
//noperspective out vec4 noPerspectiveColor;
//noperspective out vec4 noPerspectiveTexCoords;

void main (void)
{	
	// SHADING en coordendas de la camara	
	
	// Transformacion de la normal a coordenadas de la camara
	vec3 eyeCoordsNormal = normalize(gl_NormalMatrix * gl_Normal);
	//Transformacion de la posicion a coordenadas de la camara
	vec4 eyeCoordsPosition = gl_ModelViewMatrix * gl_Vertex;

	//Homogenizamos posicion
	vec3 eyeCoordsPosition3 = (vec3 (eyeCoordsPosition)) / eyeCoordsPosition.w;
		  
	//Direccion de vista
	vec3 v =  vec3 (0.0, 0.0, 0.0) - eyeCoordsPosition3;
	v = normalize(v);

	//Direccion de luz:
	//OJO: La posicion de la luz viene ya transformada a coordenadas de la camara
	vec3 l = vec3 (gl_LightSource[0].position) - eyeCoordsPosition3;

	//Distancia de Luz
	float d = length(l);

	//Normalizamos direccion de luz
	l = normalize(l);

	// Vector medio entre direccion de vision y luz
	vec3 h = normalize(l + v);

	//Shading color
	vec4 color = vec4(0.0);

	//Componente ambiente		
	vec4 ambient = gl_Color * gl_FrontLightModelProduct.sceneColor;
	color += ambient;

	//TEST: paso de parametros
	//int currentLights = min(int(numLights), gl_MaxLights);
	//if(currentLights == 1)
	//{
		//color = vec4(1.0,0.0,0.0,1.0);
	//}

	//Para cada fuente de luz aplicamos el modelo de shading
	for(int i=0; i<gl_MaxLights; i++)
	{
		// Atenuacion
		float attenuation = 1.0 / (gl_LightSource[i].constantAttenuation +
			gl_LightSource[i].linearAttenuation * d +
			gl_LightSource[i].quadraticAttenuation * d * d);

		//Componente difusa
		vec4 diffuse = gl_Color * gl_LightSource[i].diffuse *
			attenuation * max(0.0, dot(eyeCoordsNormal, l));

		//Componente especular
		vec4 specular = gl_FrontMaterial.specular * gl_LightSource[i].specular *
			attenuation * pow(max(0.0, dot(eyeCoordsNormal, h)), gl_FrontMaterial.shininess);
	
		color += diffuse + specular;
	}
	
	color = clamp( color, 0.0, 1.0 );
	
	//Asignamos el color de este vertice con lo que calculamos
	gl_FrontColor = color;

	/// VIEWING
	// Transformacion de la posicion a coordenadas de objeto a coordenadas de clipping
	//gl_Position = ftransform();
	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
	
	// TEXTURE MAPPING 
	// Asignamos las coordenadas de textura a gl_TexCoord para que sean interpoladas
	gl_TexCoord[0] = gl_MultiTexCoord0;

	//TEST: Modificar interpolacion
	//flatColor = color;
	//noPerspectiveColor = color;
	//noPerspectiveTexCoords = gl_MultiTexCoord0;

}